package com.hsnn.medstgmini.util;

import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @category map转实体类
 * @author 蔡春龙
 * @date 2015年8月18日
 */
public class MapToBeanUtil {

	/**
	 * @category map转bean对象
	 * @date 2015年8月18日
	 * @param map
	 * @param clazz
	 * @return
	 */
	@Deprecated
	public static <T> T mapToBean(Map<String, Object> map, Class<T> clazz) {
		Map<String, Method> methodMap = new HashMap<String, Method>();
		if (clazz != null) {
			Method[] methods = clazz.getMethods();
			if (methods != null && methods.length > 0) {
				for (Method method : methods) {
					methodMap.put(method.getName(), method);
				}
			}
		}
		return setPropertyValue(map, methodMap, clazz);
	}

	/**
	 * @category map转bean对象
	 * @date 2015年8月18日
	 * @param map
	 * @param clazz
	 * @return
	 */
	@Deprecated
	public static <T> List<T> mapToBean(List<Map<String, Object>> list,
			Class<T> clazz) {
		List<T> ts = new LinkedList<T>();
		Map<String, Method> methodMap = new HashMap<String, Method>();
		if (clazz != null) {
			Method[] methods = clazz.getMethods();
			if (methods != null && methods.length > 0) {
				for (Method method : methods) {
					methodMap.put(method.getName(), method);
				}
			}
		}
		if (list != null && !list.isEmpty()) {
			for (Map<String, Object> map : list) {
				T t = setPropertyValue(map, methodMap, clazz);
				ts.add(t);
			}
		}
		return ts;
	}

	/**
	 * @category 为bean属性赋值
	 * @date 2015年8月18日
	 * @param map
	 * @param methodMap
	 * @param clazz
	 * @return
	 */
	private static <T> T setPropertyValue(Map<String, Object> map,
			Map<String, Method> methodMap, Class<T> clazz) {
		if (map == null) {
			return null;
		}
		T t = null;
		try {
			t = clazz.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			return t;
		}
		Set<String> keys = map.keySet();
		for (String key : keys) {
			Object value = map.get(key);
			if (value == null) {
				continue;
			}
			Method method = methodMap.get("set" + firstToUpper(key));
			if (method == null) {
				continue;
			}
			if (value instanceof Byte) {
				Integer val = Integer.valueOf((Byte) value);
				if (method != null) {
					try {
						method.invoke(t, val);
					} catch (Exception e) {
						e.printStackTrace();
						continue;
					}
				}
			} else if (value instanceof BigDecimal) {
				BigDecimal val = (BigDecimal) value;
				if (val != null) {
					if (method != null) {
						try {
							method.invoke(t, val.doubleValue());
						} catch (Exception e) {
							// e.printStackTrace();
							try {
								method.invoke(t, val.intValue());
							} catch (Exception e1) {
								e1.printStackTrace();
								continue;
							}
						}
					}
				}
			} else if (value instanceof Integer || value instanceof BigInteger) {
				Integer val = Integer.valueOf(String.valueOf(value));
				if (method != null) {
					try {
						method.invoke(t, val);
					} catch (Exception e) {
						e.printStackTrace();
						continue;
					}
				}
			} else if (value instanceof Date) {
				Date val = (Date) value;
				if (method != null) {
					try {
						method.invoke(t, val);
					} catch (Exception e) {
						e.printStackTrace();
						continue;
					}
				}
			} else if (value instanceof String) {
				String val = String.valueOf(value);
				if (method != null) {
					try {
						method.invoke(t, val);
					} catch (Exception e) {
						e.printStackTrace();
						continue;
					}
				}
			}
		}
		return t;
	}

	/**
	 * @category 首字母转大写
	 * @date 2015年8月18日
	 * @param str
	 * @return
	 */
	public static String firstToUpper(String str) {
		char[] array = str.toCharArray();
		array[0] -= 32;
		return String.valueOf(array);
	}

}
